// 给你一个由 '1'（陆地）和 '0'（水）组成的的二维网格，请你计算网格中岛屿的数量。
// 岛屿总是被水包围，并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
// 此外，你可以假设该网格的四条边均被水包围。

// 示例 1：
// 输入：grid = [
//   ['1','1','1','1','0'],
//   ['1','1','0','1','0'],
//   ['1','1','0','0','0'],
//   ['0','0','0','0','0']
// ]
// 输出：1

// 示例 2：
// 输入：grid = [
//   ['1','1','0','0','0'],
//   ['1','1','0','0','0'],
//   ['0','0','1','0','0'],
//   ['0','0','0','1','1']
// ]
// 输出：3

function numIslands(grid) {
  // 处理空数组情况
  if (grid.length === 0) {
    return 0;
  }

  // 处理非空数组情况
  let count = 0;
  for (let i = 0; i < grid.length; i++) {
    for (let j = 0; j < grid[0].length; j++) {
      if (grid[i][j] === "1") {
        count++;
        dfs(grid, i, j);
      }
    }
  }
  return count;
}

function dfs(grid, i, j) {
  // 检查当前位置是否超出网格范围或为水
  if (
    i < 0 ||
    i >= grid.length ||
    j < 0 ||
    j >= grid[0].length ||
    grid[i][j] === "0"
  ) {
    return;
  }

  // 标记当前位置为已访问
  grid[i][j] = "0";
  // 递归标记与当前位置相邻的陆地为 '0'
  // 上
  dfs(grid, i - 1, j);
  // 下
  dfs(grid, i + 1, j);
  // 左
  dfs(grid, i, j - 1);
  // 右
  dfs(grid, i, j + 1);
}
